//package com.qf.index;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.collection.ConcurrentHashSet;
//import cn.hutool.core.util.NumberUtil;
//import cn.hutool.db.Db;
//import cn.hutool.db.Entity;
//import cn.hutool.json.JSONUtil;
//import com.alibaba.fastjson.JSONObject;
//import lombok.Data;
//
//import java.io.Serializable;
//import java.sql.SQLException;
//import java.text.SimpleDateFormat;
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//public class TestB {
//
//    public static void main(String[] args) throws SQLException {
//
//        String newDataName = "scholar_25_02.";
//        String htLocationChinaTable = newDataName + "ht_location_china";
//        String summaryTable = newDataName + "unified_search_summary_0120_old";
//        String infoAndSumTable = newDataName + "info_and_sum";
//        String abbrInfoSumTable = newDataName + "abbr_info_sum";
//        String univHospStartTable = newDataName + "univ_hosp_start";
//
//        String full = "Southern University Science & Technol, Shenzhen Peoples Hospital, Department Neurol, Affiliated Hospital 1, Shenzhen, Guangdong, People's Republic of China";
/// /
//        enUnivTest(full, htLocationChinaTable);
//
/// /        readTable(summaryTable, "id", "year`,`c1_au", infoAndSumTable, abbrInfoSumTable, univHospStartTable);
//
////        updateInfoAndSumTable(infoAndSumTable, "id", "info`,`sum");
//
//    }
//
//    public static void enUnivTest(String full, String htLocationChinaTable) throws SQLException {
//        Set<String> acadSet = uSet.getAcadSet();
//        Set<String> centerSet = uSet.getCenterSet();
//        Set<String> collSet = uSet.getCollSet();
//        Set<String> hospSet = uSet.getHospSet();
//        Set<String> univSet = uSet.getUnivSet();
//        Set<String> removeSet = uSet.getRemoveSet();
//        Set<String> dellSet = uSet.getDellSet();
//        Set<String> subjectSet = cList.getSubjectSet();
//        Map<String, String> standardMap = new ConcurrentHashMap<>();
////        Set<String> unitSet = new HashSet<>();
////        Set<String> deptSet = new HashSet<>();
//        Set<String> citySet = new HashSet<>();
//        Set<String> toDeptSet = uSet.toDept();
//        Set<String> provCitySet = Dept.getProvCitySet(htLocationChinaTable, "id", "prov`,`name", citySet);
////        String full = ("".equals(c1Auth.getFull()) ? c1Auth.getInfo() : c1Auth.getFull()).replace("ETH, Zurich", "ETH Zurich");
//        Set<String> unitSet = new HashSet<>();
//        Set<String> deptSet = new HashSet<>();
//        int is_cn_hosp = 0;
//        int is_cn_univ = 0;
//        int is_en_hosp = 0;
//        int is_en_univ = 0;
//        if (Utils.isContainChinese(full)) {
//            boolean isCnHosp = full.contains("医院") || full.contains("疾病预防控制中心") || full.contains("肿瘤防治中心") || full.contains("预防控制中心") || full.contains("医疗救治中心") || full.contains("眼病防治中心") || full.contains("血液病研究所") ||
//                    full.contains("传染病防治院") || full.contains("眼科研究所") || full.contains("心肺研究所") || full.contains("肾病研究所") || full.contains("妇幼保健院") || full.contains("妇婴保健院") || full.contains("妇女保健院") ||
//                    full.contains("儿科研究所") || full.contains("癌症研究所") || full.contains("诊疗中心") || full.contains("医学中心") || full.contains("医疗中心") || full.contains("眼科中心") || full.contains("卫生中心") || full.contains("体检中心") ||
//                    full.contains("临床中心") || full.contains("精神病院") || full.contains("健康中心") || full.contains("急救中心") || full.contains("病研究所") || full.contains("保健中心") || full.contains("癌症中心") || full.contains("防疫站") || full.contains("医 院");
//            boolean isCnUniv = full.contains("大学") || full.contains("学院") || full.contains("学校");
//            if (isCnHosp || isCnUniv) {
//                Unit.getCnUnit(full, unitSet);
//                Dept.getCnDept(full, provCitySet, deptSet, citySet, unitSet);
//                // 如果没有获取到学科的集合（即部门信息，比如仅有山东大学齐鲁医院，后面没有什么科室信息的），而又属于大学和医院的，对大学的学科加上"临床医学"，即认为大学的附属医院为"临床医学"学科。
//                if (deptSet.isEmpty() && isCnUniv && isCnHosp) {
//                    deptSet.add("[univ]" + "临床医学");
//                }
//            }
//            is_cn_hosp = isCnHosp ? 1 : is_cn_hosp;
//            is_cn_univ = isCnUniv ? 1 : is_cn_univ;
//        } else {
//            boolean isEnUniv = Unit.isUniv(full, univSet, removeSet);
//            boolean isEnHosp = Unit.isHosp(full, hospSet, removeSet);
//            is_en_hosp = isEnHosp ? 1 : is_en_hosp;
//            is_en_univ = isEnUniv ? 1 : is_en_univ;
//            if (isEnUniv || isEnHosp) {
//                Set<String> depts = new HashSet<>();
//                Dept.getEnDept(full, depts, subjectSet, removeSet);
//                Set<String> units = Unit.getEnUnit(full, standardMap, acadSet, centerSet, collSet, hospSet, univSet, removeSet, dellSet);
//                String univ = "";
//                String hosp = "";
//                // 如果大学拿到了标准的大学名称，比如："karolinska institute"，那么，可以让大学集合(units)只要这一个标准的名字，并从depts集合中移除。医院也作相同的操作，大学的名字主要要了大学及学院，医院的名字主要要了医院和诊所。
//                for (String s : units) {
//                    String t = " " + s.toLowerCase().trim() + " ";
//                    boolean isUniv = t.contains(" universidad ") || t.contains("universidade") || t.contains(" université ") || t.contains("universitario") || t.contains(" universe ") || t.contains(" universitas ") || t.contains(" università ") || t.contains("universitaire") ||
//                            t.contains(" univ ") || t.contains(" universität ") || t.contains(" universal ") || t.contains(" universiti ") || t.contains(" universitat ") || t.contains(" universitário ") || t.contains(" universitaria ") || t.contains(" universitari ") ||
//                            t.contains(" universiteit ") || t.contains("karolinska institute") || t.contains("trinity college dublin") || t.contains("royal institute technol") || t.contains("korea advance(d) institute science & technol") || t.contains(" ip paris ") ||
//                            t.contains("institute polytech paris") || t.contains("london school economy") || t.contains("calif institute technol") || t.contains(" eth zurich ") || t.contains("ecole polytech federal lausanne") || t.contains("swiss federal institute technol") ||
//                            t.contains("massachusetts institute technol") || t.contains(" iit delhi ") || t.contains("university") || t.contains("korea adv inst sci & technol") || Unit.isContainsAbbr(full);
//                    boolean isHosp = t.contains("mayo clinical") || t.contains("cleveland clinical") || t.contains("memorial sloan kettering cancer center") || t.contains("md anderson cancer center") || t.contains("anderson cancer center") || t.contains("md anderson") ||
//                            t.contains("walter reed nacional military medicinal center") || t.contains("walter reed nacional military medical center") || t.contains("nacional naval medical center") || t.contains("walter reed nacional medical center") ||
//                            t.contains("university health network") || t.contains("hospital") || t.contains("charite university medical berlin") || t.contains("ronald reagan ucla medical center") || t.contains("sheba medical center") ||
//                            t.contains("all india institute medical science") || t.contains("asan medical center") || t.contains("beth israel deaconess medical center") || t.contains("samsung medical center") || t.contains("heart center leipzig") ||
//                            t.contains("deutsches herzzentrum berlin") || t.contains("cedars sinai medical center") || t.contains("nacional heart center singapore") || t.contains("policlin university a gemelli") || t.contains("university navarra clinical") ||
//                            t.contains("fundacion irccs ist neurol carlo besta") || t.contains("lmu klinikum") || t.contains("clinical barcelona") || t.contains("sunnybrook health science center") || t.contains("grande ospedale metropolitano niguarda") ||
//                            t.contains("gustave roussy") || t.contains("ist europeo oncol") || t.contains("princess margaret cancer center") || t.contains("dana farber cancer institute") || t.contains("peter maccallum cancer center") || t.contains("institute curie") ||
//                            t.contains("schulthess clinical") || t.contains("helios endo klinik hamburg") || t.contains("ist ortopedico rizzoli") || t.contains("ospedale pediatrico bambino gesu") || t.contains("nacional jewish health") || t.contains("thoraxklinik heidelberg") ||
//                            t.contains("hosptial") || t.contains("hospices") || t.contains(" hospita ") || t.contains(" hospice ") || full.contains("MSKCC") || full.contains("MDACC") || full.contains("WRNMMC") || full.contains("INCOR");
//                    if (isUniv && !isHosp) {
//                        univ = s;
//                    }
//                    if (!isUniv && isHosp) {
//                        hosp = s;
//                    }
//                }
//                // 如果有标准的大学名字，且不含医院，则只要标准的大学的名称，并把大学的名称从科室中移除（虽然大概率不会出现在科室中）。医院也作这样的操作。
//                if (!univ.isEmpty() && !isEnHosp) {
//                    unitSet.add(univ.toLowerCase());
//                    depts.remove(univ);
//                } else if (!hosp.isEmpty() && !isEnUniv) {
//                    unitSet.add(hosp.toLowerCase());
//                    depts.remove(hosp);
//                } else {
//                    for (String s : units) {
//                        unitSet.add(s.toLowerCase());
//                        depts.remove(s);
//                    }
//                }
//                // 部分学院的单词，也会被识别为大学，比如："school medical"，在此给予移除。
//                if (isEnUniv) {
//                    for (String toDept : toDeptSet) {
//                        if (unitSet.contains(toDept)) {
//                            unitSet.remove(toDept);
//                            deptSet.add("[univ]" + toDept);
//                        }
//                    }
//                }
//                for (String s : depts) {
//                    if (isEnUniv) {
//                        deptSet.add("[univ]" + s.toLowerCase());
//                    }
//                    if (isEnHosp) {
//                        deptSet.add("[hosp]" + s.toLowerCase());
//                    }
//                }
//                if (deptSet.isEmpty() && isEnUniv && isEnHosp) {
//                    deptSet.add("[univ]" + "临床医学");
//                }
//
//                System.out.println("unitSet: " + unitSet);
//                System.out.println("deptSet: " + deptSet);
//
//            }
//        }
//    }
//
//    public static void enTest(String full, String htLocationChinaTable) throws SQLException {
//        Set<String> acadSet = uSet.getAcadSet();
//        Set<String> centerSet = uSet.getCenterSet();
//        Set<String> collSet = uSet.getCollSet();
//        Set<String> hospSet = uSet.getHospSet();
//        Set<String> univSet = uSet.getUnivSet();
//        Set<String> removeSet = uSet.getRemoveSet();
//        Set<String> dellSet = uSet.getDellSet();
//        Set<String> subjectSet = cList.getSubjectSet();
//        Map<String, String> standardMap = new ConcurrentHashMap<>();
//        Set<String> unitSet = new HashSet<>();
//        Set<String> deptSet = new HashSet<>();
//        Set<String> citySet = new HashSet<>();
//        Set<String> provCitySet = Dept.getProvCitySet(htLocationChinaTable, "id", "prov`,`name", citySet);
//        if (Utils.isContainChinese(full)) {
//            boolean isCnHosp = full.contains("医院") || full.contains("疾病预防控制中心") || full.contains("肿瘤防治中心") || full.contains("预防控制中心") || full.contains("医疗救治中心") || full.contains("眼病防治中心") || full.contains("血液病研究所") ||
//                    full.contains("传染病防治院") || full.contains("眼科研究所") || full.contains("心肺研究所") || full.contains("肾病研究所") || full.contains("妇幼保健院") || full.contains("妇婴保健院") || full.contains("妇女保健院") ||
//                    full.contains("儿科研究所") || full.contains("癌症研究所") || full.contains("诊疗中心") || full.contains("医学中心") || full.contains("医疗中心") || full.contains("眼科中心") || full.contains("卫生中心") || full.contains("体检中心") ||
//                    full.contains("临床中心") || full.contains("精神病院") || full.contains("健康中心") || full.contains("急救中心") || full.contains("病研究所") || full.contains("保健中心") || full.contains("癌症中心") || full.contains("防疫站") || full.contains("医 院");
//            boolean isCnUniv = full.contains("大学") || full.contains("学院") || full.contains("学校");
//            if (isCnHosp || isCnUniv) {
//                Unit.getCnUnit(full, unitSet);
//                Dept.getCnDept(full, provCitySet, deptSet, citySet, unitSet);
//                // 如果没有获取到学科的集合（即部门信息，比如仅有山东大学齐鲁医院，后面没有什么科室信息的），而又属于大学和医院的，对大学的学科加上"临床医学"，即认为大学的附属医院为"临床医学"学科。
//                if (deptSet.isEmpty() && isCnUniv && isCnHosp) {
//                    deptSet.add("[univ]" + "临床医学");
//                }
//            }
//        } else {
//            boolean isEnUniv = Unit.isUniv(full, univSet, removeSet);
//            boolean isEnHosp = Unit.isHosp(full, hospSet, removeSet);
//            if (isEnUniv || isEnHosp) {
//                Set<String> depts = new HashSet<>();
//                Dept.getEnDept(full, depts, subjectSet, removeSet);
//                Set<String> units = Unit.getEnUnit(full, standardMap, acadSet, centerSet, collSet, hospSet, univSet, removeSet, dellSet);
//                System.out.println("deptSet:1 " + depts);
//                System.out.println("unitSet:1 " + units);
//                String univName = "";
//                String hospName = "";
//                for (String s : units) {
//                    if (s.toLowerCase().contains("university")) {
//                        univName = s;
//                    }
//                    if (s.toLowerCase().contains("hospital")) {
//                        hospName = s;
//                    }
//                }
//                System.out.println("univName: " + univName + " hospName: " + hospName + " isEnUniv: " + isEnUniv + " isEnHosp: " + isEnHosp);
//                if (!univName.isEmpty() && !isEnHosp) {
//                    unitSet.add(univName);
//                    depts.remove(univName);
//                } else if (!hospName.isEmpty() && !isEnUniv) {
//                    unitSet.add(hospName);
//                    depts.remove(hospName);
//                } else {
//                    for (String s : units) {
//                        unitSet.add(s);
//                        depts.remove(s);
//                    }
//                }
//                for (String s : depts) {
//                    if (isEnUniv) {
//                        deptSet.add("[univ]" + s);
//                    }
//                    if (isEnHosp) {
//                        deptSet.add("[hosp]" + s);
//                    }
//                }
//                if (deptSet.isEmpty() && isEnUniv && isEnHosp) {
//                    deptSet.add("[univ]" + "临床医学");
//                }
//            }
//        }
//
//        System.out.println("deptSet:2 " + deptSet);
//        System.out.println("unitSet:2 " + unitSet);
//
//
//    }
//
//    public static void readTable(String summaryTable, String autoId, String field, String infoAndSumTable, String abbrInfoSumTable, String univHospStartTable) throws SQLException {
//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        int onePageNum = 1000;
//        String limit = "";
////        String limit = " limit 1";
//        List<Entity> tableNum = Db.use().query("select count(1) as count from " + summaryTable);
//        Map<String, Integer> collAndSumMap = new HashMap<>();
//        Map<String, Integer> startAndSumMap = new HashMap<>();
//        Map<String, Map<String, Integer>> abbrAndFullAndSumMap = new HashMap<>();
//        if (tableNum.get(0).getInt("count") > 0) {
//            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryTable).intValue();
//            Collection<Integer> tableList = new ArrayList<>();
//            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
//            for (Integer startId : tableList) {
//                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1) + limit);
//                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + summaryTable + Utils.printMemoryStr() + "\033[0m");
//                for (Entity entry : tableData) {
//                    Integer year = entry.getInt("year");
//                    String c1Au = entry.getStr("c1_au");
//                    if (null != year && year > 2018 && null != c1Au && c1Au.contains("sort")) {
//                        List<TestA.C1Auth> c1s = JSONObject.parseArray(c1Au, TestA.C1Auth.class);
//                        for (TestA.C1Auth c1 : c1s) {
//                            String full = "".equals(c1.getFull()) ? c1.getInfo() : c1.getFull();
//                            String[] split = full.replace("; ", ", ").split(", ");
//                            for (String s : split) {
//                                String t = s.toLowerCase().trim();
//                                if (t.contains("school") || t.contains("college") || t.contains("faculty")) {
//                                    collAndSumMap.compute(t, (key, value) -> value != null ? (value + 1) : 1);
//                                }
//                                if (s.contains("(") && s.contains(")") && !Utils.isContainChinese(s)) {
//                                    String[] list = s.split("\\(");
//                                    if (list.length == 2 && !list[0].contains(")") && list[1].contains(")")) {
//                                        String abbr = list[1].substring(0, list[1].indexOf(")"));
//                                        if (list[0].length() > 8 && abbr.length() > 2 && list[0].substring(0, 1).equals(abbr.substring(0, 1)) && !Pattern.compile("[a-z]").matcher(abbr).find()) {
//                                            Utils.putStrStrInt(abbr.trim(), list[0].trim(), abbrAndFullAndSumMap);
//                                        }
//                                    }
//                                }
//                            }
//                            String[] list = full.replace(";", " ").replace("(", " ").replace(",", " ").split(" ");
//                            for (String s : list) {
//                                String l = s.toLowerCase().trim();
//                                if (l.startsWith("univ") || l.startsWith("hosp")) {
//                                    startAndSumMap.compute(l, (key, value) -> value != null ? (value + 1) : 1);
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        Db.use().execute("truncate table " + infoAndSumTable);
//        collAndSumMap.keySet().parallelStream().forEach(coll -> {
//            try {
//                Db.use().insert(Entity.create(infoAndSumTable).set("info", coll).set("sum", collAndSumMap.get(coll)));
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        });
//
//        Db.use().execute("truncate table " + univHospStartTable);
//        startAndSumMap.keySet().parallelStream().forEach(start -> {
//            try {
//                Db.use().insert(Entity.create(univHospStartTable).set("info", start).set("sum", startAndSumMap.get(start)));
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        });
//
//        Db.use().execute("truncate table " + abbrInfoSumTable);
//        for (Map.Entry<String, Map<String, Integer>> entry : abbrAndFullAndSumMap.entrySet()) {
//            String abbr = entry.getKey();
//            Map<String, Integer> fullAndSumMap = Utils.mapSortValueIntLen(entry.getValue(), 3);
//            int max = 0;
//            for (Map.Entry<String, Integer> map : fullAndSumMap.entrySet()) {
//                max = map.getValue() > max ? map.getValue() : max;
//            }
//            try {
//                Db.use().insert(Entity.create(abbrInfoSumTable).set("abbr", abbr).set("info", JSONUtil.toJsonStr(fullAndSumMap)).set("sum", max));
//            } catch (SQLException e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//
//    public static void updateInfoAndSumTable(String infoAndSumTable, String autoId, String field) throws SQLException {
//        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        int onePageNum = 1000;
//        Set<String> univSet = uSet.getUnivSet();
//        Set<String> removeSet = uSet.getRemoveSet();
//        List<Entity> tableNum = Db.use().query("select count(1) as count from " + infoAndSumTable);
//        if (tableNum.get(0).getInt("count") > 0) {
//            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + infoAndSumTable).intValue();
//            Collection<Integer> tableList = new ArrayList<>();
//            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
//            for (Integer startId : tableList) {
//                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + infoAndSumTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
//                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + infoAndSumTable + Utils.printMemoryStr() + "\033[0m");
//                for (Entity entry : tableData) {
//                    String info = entry.getStr("info");
//                    Integer id = entry.getInt(autoId);
//                    Integer sum = entry.getInt("sum");
//                    if (null != info && info.length() > 4 && null != id && id > 0 && null != sum && sum > 999) {
//                        boolean isEnUniv = Unit.isUniv(info, univSet, removeSet);
//                        try {
//                            Db.use().update(Entity.create().set("is_univ", isEnUniv ? 1 : 0), Entity.create(infoAndSumTable).set(autoId, id));
//                        } catch (SQLException e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            }
//        }
//    }
//
//
//}
